home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / PPLS.ZIP / WHATSNEW.PPL < prev   
Text File  |  1993-12-30  |  29KB  |  743 lines

  1. | A vertical bar denotes changes since the last posting of the file.
  2. |
  3. | Current Posting Dated: 11/11/93
  4.  
  5.  WHATSNEW in the PCBoard Programming Language (PPL) version 2.00:
  6.  ----------------------------------------------------------------
  7.  
  8.  - The following new types have been added to PPL 2.00:
  9.  
  10.      BIGSTR   -> Allows up to 2048 characters per big string
  11.                    (up from 256 for STRING variables)
  12.                  May include CHR(0) characters in the middle of the big string
  13.                    (unlike STRING variables which may not)
  14.  
  15.      EDATE    -> Julian date in earth date format
  16.                  Deals with dates formatted YYMM.DD
  17.                  Range:  Same as DATE
  18.  
  19.      REAL     -> 4-byte floating point number
  20.                  Range:  +/-3.4E-38 - +/-3.4E+38 (7-digit precision)
  21.  
  22.      DREAL    -> 8-byte floating point number
  23.                  Range:  +/-1.7E-308 - +/-1.7E+308 (15-digit precision)
  24.  
  25.      FLOAT    -> 4-byte floating point number        (same as REAL)
  26.                  Range:  +/-3.4E-38 - +/-3.4E+38 (7-digit precision)
  27.  
  28.      DOUBLE   -> 8-byte floating point number        (same as DREAL)
  29.                  Range:  +/-1.7E-308 - +/-1.7E+308 (15-digit precision)
  30.  
  31.      UNSIGNED -> 4-byte unsigned integer
  32.                  Range:  0 - 4,294,967,295
  33.  
  34.      BYTE     -> 1-byte unsigned integer
  35.                  Range:  0 - 255
  36.  
  37.      WORD     -> 2-byte unsigned integer
  38.                  Range:  0 - 65,535
  39.  
  40.      DWORD    -> 4-byte unsigned integer             (same as UNSIGNED)
  41.                  Range:  0 - 4,294,967,295
  42.  
  43.      UBYTE    -> 1-byte unsigned integer             (same as BYTE)
  44.                  Range:  0 - 255
  45.  
  46.      UWORD    -> 2-byte unsigned integer             (same as WORD)
  47.                  Range:  0 - 65,535
  48.  
  49.      UDWORD   -> 4-byte unsigned integer             (same as UNSIGNED)
  50.                  Range:  0 - 4,294,967,295
  51.  
  52.      SBYTE    -> 1-byte signed integer
  53.                  Range:  -128 - 127
  54.  
  55.      SWORD    -> 2-byte signed integer
  56.                  Range:  -32,768 - 32,767
  57.  
  58.      SDWORD   -> 4-byte signed integer               (same as INTEGER)
  59.                  Range:  -2,147,483,648 - 2,147,483,647
  60.  
  61.      SHORT    -> 1-byte signed integer               (same as SBYTE)
  62.                  Range:  -128 - 127
  63.  
  64.      INT      -> 2-byte signed integer               (same as SWORD)
  65.                  Range:  -32,768 - 32,767
  66.  
  67.      LONG     -> 4-byte signed integer               (same as INTEGER)
  68.                  Range:  -2,147,483,648 - 2,147,483,647
  69.  
  70.  - Added a BREAK statement which can be used to break out of a WHILE or FOR
  71.      loop without the use of a GOTO statement
  72.  
  73.  - Added a QUIT statement which can be used to break out of a WHILE or FOR
  74.      loop without the use of a GOTO statement (alias for BREAK)
  75.  
  76.  - Added a CONTINUE statement which can be used to abort the current iteration
  77.      of a WHILE or FOR loop and resume with the next iteration of the loop
  78.  
  79.  - Added a LOOP statement which can be used to abort the current iteration
  80.      of a WHILE or FOR loop and resume with the next iteration of the loop
  81.      (alias for CONTINUE)
  82.  
  83.  - Modified FCLOSE to accept channel -1 as the READLINE() function
  84.      'channel' and close it
  85.  
  86.  - Added a FFLUSH statement to flush a specified channels changes to disk
  87.  
  88.      Usage:  FFLUSH channel
  89.  
  90.  - Added a FSEEK statement to position to any random location within a file
  91.  
  92.      Usage:  FSEEK channel,bytes,position
  93.  
  94.              bytes is the number of bytes to move (+/-) relative to position
  95.  
  96.              position is the base location to start the seek from
  97.                (SEEK_SET (0) for the beginning of the file, SEEK_CUR (1) for
  98.                the current file pointer location, SEEK_END (2) for the end of
  99.                the file)
  100.  
  101.  - Added a FREAD statement to read binary data from a file
  102.  
  103.      Usage:  FREAD channel,var,size
  104.  
  105.              var is the variable into which data should be read
  106.  
  107.              size is the size of data to read into var (0 - 2048)
  108.  
  109.  - Added a FWRITE statement to write binary data to a file
  110.  
  111.      Usage:  FWRITE channel,exp,size
  112.  
  113.              exp is the expression whose result should be written
  114.  
  115.              size is the size of data to write to var
  116.  
  117.  - Added a FDEFIN statement to specify a default input file channel
  118.      (used to speed up file input)
  119.  
  120.      Usage:  FDEFIN channel
  121.  
  122.  - Added a FDEFOUT statement to specify a default output file channel
  123.      (used to speed up file output)
  124.  
  125.      Usage:  FDEFOUT channel
  126.  
  127.  - Added the following default channel input statements:  FDGET & FDREAD
  128.    They use the exact same arguments as FGET & FREAD except a channel
  129.      parameter (the channel specified by FDEFIN is assumed)
  130.  
  131.  - Added the following default channel output statements:  FDPUT, FDPUTLN,
  132.      FDPUTPAD, & FDWRITE
  133.    They use the exact same arguments as FPUT, FPUTLN, FPUTPAD, & FWRITE except
  134.      a channel parameter (the channel specified by FDEFOUT is assumed)
  135.  
  136.  - Added a REDIM statement to dynamically redimension an array at
  137.      run-time. To use it you must declare the array in advance with the
  138.      number subscripts desired.  This allows the compiler to perform it's
  139.      standard error checking on subscripts.  For example:
  140.  
  141.      STRING s(1,1,1)
  142.      REDIM s,5,5,5
  143.      LET s(4,4,4) = "Hello, World!"
  144.      PRINTLN s(4,4,4)
  145.  
  146.    If an attempt is made to redimension an array with a different number
  147.      of dimensions, an error or warning (as appropriate) will be
  148.      generated.
  149.  
  150.  - Added an APPEND statement to append the contents of one file to
  151.      another file.  The syntax is:
  152.  
  153.      APPEND "SRCFILE","DSTFILE"
  154.  
  155.  - Added a COPY statement to copy the contents of one file to another
  156.      file.  The syntax is:
  157.  
  158.      COPY "SRCFILE","DSTFILE"
  159.  
  160.  - Added a LASTIN statement to set the users last conference in value. It
  161.      can be used during the logon process to force the user into a
  162.      particular conference at start up (for example, from a logon
  163.      script). The syntax is:
  164.  
  165.      LASTIN 6 ; The user was 'last in' conference 6
  166.  
  167.  - Added a FLAG statement to allow flagging files for download directly
  168.      from a PPE.  The syntax is:
  169.  
  170.      FLAG "C:\PATH\FILENAME.ZIP" ; Or whatever file name desired
  171.  
  172.    Note that FLAG does not attempt to honor restrictions in the FSEC
  173.      and/or DLPATH.LST files.  This allows you to flag up any file
  174.      desired.
  175.  
  176.  - Added a DOWNLOAD statement to allow downloading files from PPL.  The
  177.      syntax is:
  178.  
  179.      DOWNLOAD "CMD;CMD;CMD"
  180.  
  181.    The string passed to DOWNLOAD is a list of commands in the same format
  182.      as what a user would type after a D or DB command.  If a file name
  183.      for download is specified here it must be downloadable according to
  184.      the criteria established in the FSEC and DLPATH.LST files.  If it is
  185.      necessary to download a file not normally available via the FSEC
  186.      and/or DLPATH.LST files the FLAG statement may be used to force it
  187.      into the list of files to download.
  188.  
  189.  - Added a WRUSYSDOOR statement to write a USERS.SYS file with a TPA
  190.      record for a DOOR application.  The syntax is:
  191.  
  192.      WRUSYSDOOR "DOORNAME"
  193.  
  194.  - Added KBDSTRING statement to stuff strings to the keyboard (just like
  195.      KBDSTUFF except 'keystrokes' are echoed to the display)
  196.  
  197.  - Added a KBDFLUSH statement to flush the local keyboard buffer and any
  198.      stuffed keystroke buffers.  It takes no arguments.
  199.  
  200.  - Added a MDMFLUSH statement to flush the incoming modem buffer.  It
  201.      takes no arguments.
  202.  
  203.  - Added a KEYFLUSH statement to flush both the local buffers and the
  204.      incoming modem buffer.  It takes no arguments.
  205.  
  206.  - Added ALIAS statement to allow PPE control of whether or not the user
  207.      is using an alias
  208.  
  209.  - Added a CONFALIAS() function to return TRUE if the current conference
  210.      is configured to allow aliases
  211.  
  212.  - Added a USERALIAS() function to return TRUE if the current user is
  213.      allowed to use an alias
  214.  
  215.  - Added ALIAS() function to return the users current ALIAS setting
  216.      (TRUE = alias use on, FALSE = alias use off)
  217.  
  218.  - Added LANG statement to change the language in use by the current
  219.      user. The syntax is:
  220.  
  221.      LANG langNum
  222.  
  223.  - Added ADJBYTES statement to adjust the users daily download bytes.
  224.      The syntax is:
  225.  
  226.      ADJBYTES bytes
  227.  
  228.    To subtract bytes use a negative number for bytes.  To add bytes use
  229.      a positive number.
  230.  
  231.  - Added ADJDBYTES statement to adjust the users daily download bytes.
  232.      The syntax is:
  233.  
  234.      ADJDBYTES bytes
  235.  
  236.    To subtract bytes use a negative number for bytes.  To add bytes use
  237.      a positive number.
  238.  
  239.  - Added ADJTBYTES statement to adjust the users total download bytes.
  240.      The syntax is:
  241.  
  242.      ADJTBYTES bytes
  243.  
  244.    To subtract bytes use a negative number for bytes.  To add bytes use
  245.      a positive number.
  246.  
  247.  - Added ADJTFILES statement to adjust the users total download files.
  248.      The syntax is:
  249.  
  250.      ADJTFILES files
  251.  
  252.    To subtract files use a negative number for files.  To add files use
  253.      a positive number.
  254.  
  255.  - Modified the PUTUSER statement to only update user information if a
  256.      successful GETUSER or GETALTUSER was issued previously.  This was
  257.      done to ensure that information for the current user wasn't written
  258.      to another user or vice versa.
  259.  
  260.  - Added PUTALTUSER statement to put user information.  It is merely an
  261.      alias for PUTUSER and may be used anywhere that PUTUSER would be
  262.      used.
  263.  
  264.  - Added GETALTUSER statement to get the information for an alternate
  265.      user.  It will fill the user variables with information from the
  266.      specified user record as well as redirect user statements and
  267.      functions.  Thank David for this one guys, he did the hard work, I
  268.      just hooked it into PPL.  The syntax is:
  269.  
  270.      GETALTUSER userRecordNumber
  271.  
  272.    If an attempt is made to get a record number that doesn't exist, the
  273.      user functions will revert to the current user and the user
  274.      variables will be invalidated as though no GETUSER/GETALTUSER
  275.      statement had been issued (though they will continue to maintain
  276.      any value held). PUTUSER/PUTALTUSER should be issued to commit any
  277.      variable changes to the user record.  Additionally, there is at
  278.      least one statement that will not affect alternate users:  ADJTIME.
  279.      It is restricted to the current user online.  Also, if the
  280.      alternate user is online, changes to the record won't take hold
  281.      until after the user has logged off.  Also, if there is not enough
  282.      memory available (primarily for the last message read pointers)
  283.      this statement will fail.
  284.  
  285.  - Added CURUSER() function to determine what users information, if any,
  286.      is available via the user variables.  It takes no arguments and
  287.      returns one of the following values:
  288.  
  289.      NO_USER (-1) - User variables are currently undefined
  290.      CUR_USER (0) - User variables are for the current user
  291.      Other        - The record number of an alternate user for whom user
  292.                     variables are defined
  293.  
  294.  - Added NO_USER constant (-1) for use with the CURUSER() function
  295.  
  296.  - Added CUR_USER constant (0) for use with the CURUSER() function
  297.  
  298.  - Added U_LMR(confNum) function to return the number of the last
  299.      message read for the specified conference.
  300.  
  301.  - Added CHATSTAT() function to return the current users chat
  302.      availability status (TRUE means available, FALSE means
  303.      unavailable).
  304.  
  305.  - Added DEFANS() function to return the last default answer passed to
  306.      an INPUT statement.  For example, this allows a PPE to determine
  307.      what the default answer would have been had a PCBTEXT prompt not
  308.      been replaced with a PPE.
  309.  
  310.  - Added LASTANS() function to return the last answer accepted by an
  311.      INPUT statement.
  312.  
  313.  - Added the following functions to return a users conference flags
  314.      (note that each of these functions takes a single argument which is
  315.      the conference number to check the flag)
  316.  
  317.      CONFREG(confNum) = Returns TRUE if users registered flag is set,
  318.                         FALSE otherwise
  319.  
  320.      CONFEXP(confNum) = Returns TRUE if users expired flag is set,
  321.                         FALSE otherwise
  322.                         (NOTE: CONFREG() = FALSE & CONFEXP = TRUE,
  323.                                            user locked out;
  324.                                CONFREG() = TRUE  & CONFEXP = TRUE,
  325.                                            user reg & exp)
  326.  
  327.      CONFSEL(confNum) = Returns TRUE if user has selected the conference,
  328.                         FALSE otherwise
  329.  
  330.      CONFSYS(confNum) = Returns TRUE if user has conference SysOp access,
  331.                         FALSE otherwise
  332.  
  333.      CONFMW(confNum)  = Returns TRUE if user has mail waiting in conference,
  334.                         FALSE otherwise
  335.  
  336.  - Modified the CCTYPE() function to recognize JCB cards and more Diners
  337.      Club cards to the CCTYPE() function.
  338.  
  339.  - Modified the VALCC() function to strip invalid characters from the
  340.      card number string before attempting to do the checksum.
  341.  
  342.  - Added an ERRCORRECT() function to return TRUE if a session is
  343.      determined to be error corrected (or FALSE for non-error corrected
  344.      sessions).
  345.  
  346.  - Added MIXED() function to convert a string to mixed (or proper name)
  347.      case
  348.  
  349.  - Added LPRINTED() function to return the number of lines printed on the
  350.      display
  351.  
  352.  - Added ISNONSTOP() function to return whether or not the display is
  353.      currently in non-stop mode (ie, did the user type NS as part of
  354.      their command line)
  355.  
  356.  - Added a REPLACESTR function; it functions just like the REPLACE function
  357.      except that a complete sub-string may be specified for both search and
  358.      replace
  359.  
  360.      Usage:  REPLACESTR(str,search,replace) (returns BIGSTR)
  361.  
  362.              str is the string to work on
  363.  
  364.              search is the string to search for
  365.  
  366.              replace is the string to replace search with
  367.  
  368.  - Added a STRIPSTR function; it functions just like the STRIP function
  369.      except that a complete sub-string may be specified for search
  370.  
  371.      Usage:  STRIPSTR(str,search) (returns BIGSTR)
  372.  
  373.              str is the string to work on
  374.  
  375.              search is the string to search for
  376.  
  377.  - Added the following functions (one per type):  TOBOOLEAN, TOMONEY,
  378.      TOSTRING, TOBIGSTR, TOINTEGER, TOUNSIGNED, TOREAL, TODREAL,
  379.      TOFLOAT, TODOUBLE, TODATE, TOEDATE, TOTIME, TOBYTE, TOWORD,
  380.      TODWORD, TOUBYTE, TOUWORD, TOUDWORD, TOSBYTE, TOSWORD, TOSDWORD,
  381.      TOSHORT, TOINT, & TOLONG; they are used to force the result of an
  382.      expression to a specific type
  383.  
  384.      Usage:  TOtype(exp) (returns type)
  385.  
  386.              type is the actual type to force (BIGSTR, BOOLEAN, etc.)
  387.  
  388.              exp is an expression of any type
  389.  
  390.  - Added (or documented) the following operators:
  391.  
  392.      [  -> open  parenthesis (same as ()  (also in 1.00)
  393.      {  -> open  parenthesis (same as ()  (also in 1.00)
  394.      ]  -> close parenthesis (same as ))  (also in 1.00)
  395.      }  -> close parenthesis (same as ))  (also in 1.00)
  396.  
  397.      == ->            equal  (same as =)  (also in 1.00)
  398.      != -> not        equal  (same as <>) (also in 1.00)
  399.      >< -> not        equal  (same as <>) (also in 1.00)
  400.      =< -> less    or equal  (same as <=) (also in 1.00)
  401.      => -> greater or equal  (same as >=) (also in 1.00)
  402.  
  403.      && -> logical and       (same as &)  (also in 1.00)
  404.      || -> logical or        (same as |)  (also in 1.00)
  405.  
  406.      ** -> exponentiation    (same as ^)
  407.  
  408.  - A double quote ("") may be embedded within a string constant to tell
  409.      the compiler that a single literal quote is desired (in other
  410.      words, "THIS""IS""A""TEST" would evaluate to THIS"IS"A"TEST after
  411.      the leading and trailing quotes are removed and the double quotes
  412.      were folded to single quotes)
  413.  
  414.  - Labels and variable names may now include the following characters in
  415.      addition to A-Z, 0-9, and the _ (underscore) character: $ (dollar
  416.      sign), @ (commercial at), # (pound sign), ¢ (cents), £ (british
  417.      pound), ¥ (japanese yen)
  418.  
  419.  - A \ (backslash) character as the last character on a line (before any
  420.      comments) will now allow continuing a logical line from one to the
  421.      next physical line
  422.  
  423.  - A : (colon) character may be used to separate multiple logical lines
  424.      on a single physical line
  425.  
  426.  - PPLC 1.00 would assume a LET statement if LET was not explicitly specified
  427.      in the following cases:
  428.  
  429.      1. The variable name did not match a reserved keyword
  430.  
  431.      2. The variable name was followed immediately (no space) by an equal
  432.         sign (=)
  433.  
  434.    Now the equal sign need not be flush against the variable.  In other
  435.      words, where "DIR = value" would not work before (because "DIR " is
  436.      a reserved keyword), it will work now (because the = before the
  437.      value will implicitly indicate a LET statement to the compiler).
  438.  
  439.  - The following function(s) now take and return BIGSTRs instead of STRINGs:
  440.  
  441.      REPLACE   STRIP   STRIPATX   LTRIM   RTRIM   TRIM
  442.      LOWER     UPPER   MID        LEFT    RIGHT
  443.  
  444.  - The following function(s) now take            BIGSTRs instead of STRINGs:
  445.  
  446.      LEN       INSTR
  447.  
  448.  - The following function(s) now          return BIGSTRs instead of STRINGs:
  449.  
  450.      SPACE     CHR
  451.  
  452.  - Added international currency and time support to PPL (based on the current
  453.      users language selection)
  454.  
  455.  - The FPUTPAD statement was misdocumented; it does not automatically write a
  456.      carriage return / line feed pair; if one is needed it must be written
  457.      with an FPUTLN statement
  458.  
  459.  - Added a command line switch (/NOUVAR) to PPLC to disable the automatic
  460.      generation of user variables
  461.  
  462.  - A /DISARR switch was added to PPLC to disable array dimension
  463.      checking.  This allows a different number of subscripts to be
  464.      passed to array references without compiler errors or warnings.
  465.      Additionally it allows the REDIM statement to change the number of
  466.      subscripts used by a variable.  In other words, code like this
  467.      would be legal with the /DISARR command line switch:
  468.  
  469.      STRING s      ' Note no subscripts
  470.      REDIM s,5,5,5 ' Now it has subscripts
  471.      LET s(4,4,4) = "Hello, World!"
  472.      PRINTLN s(4,4,4)
  473.  
  474.      STRING s(1,1,1) ' Note three subscripts
  475.      REDIM s,5,5     ' Now it has two subscripts
  476.      LET s(4,4) = "Hello, World!"
  477.      PRINTLN s(4,4)
  478.  
  479.  - A comment may now be started by an asterisk (*) if it is the first
  480.      non-whitespace character on a line.
  481.  
  482.  - Source files can now be included from other source files.  This is
  483.      accomplished with a compiler directive in a comment like this:
  484.  
  485.       ;$INCLUDE:FILESPEC.EXT
  486.  
  487.    (Note that the first character need not be the semi-colon.  An
  488.      apostrophe ['] or asterisk [*] may also be used where appropriate.)
  489.  
  490.    This allows you to include subroutines from a source code 'library'.
  491.      This should help in starting reusable code fragments.  When the
  492.      file is included, it is compiled as though it were in the main
  493.      source file. For example:
  494.  
  495.       FOO.INC
  496.       -------
  497.       :subroutine
  498.       PRINTLN "Hello!"
  499.       RETURN
  500.  
  501.       FOO.PPS
  502.       -------
  503.       PRINTLN "Running FOO.PPS"
  504.       GOSUB subroutine
  505.       END ' This line is important!
  506.       *$INCLUDE:FOO.INC
  507.  
  508.    Note the use of END in FOO.PPS.  It is important in this case to
  509.      ensure that you don't accidentally run subroutine twice by just
  510.      falling through to it.
  511.  
  512.  - Added the file name to warning and error displays.  For example,
  513.      where the following error may have once been reported:
  514.  
  515.      Error in line number 123
  516.  
  517.    You will now get:
  518.  
  519.      Error in file FOO.PPS, line 123
  520.  
  521.    This is necessary for the new file include functionality.
  522.  
  523.  - Fixed a bug with the MAXNODE function where 2 would always be returned
  524.      regardless of the actual licensed copy in use
  525.  
  526.  - Fixed a bug with channel processing for the FPUTPAD statement which would
  527.      cause the statement to fail
  528.  
  529.  - Fixed a bug in array subscript processing that has existed since version
  530.    1.00.  The problem would occur only in multi-dimensional arrays and only if
  531.    an attempt was made to access the minimum and maximum column subscripts (0
  532.    and whatever was defined in the source code); a value written to one would
  533.    overwrite the other.
  534.  
  535.  - Added a BITCLEAR statement to clear a specified bit from a variable.
  536.    The syntax is:
  537.  
  538.      BITCLEAR variable,bit
  539.  
  540.    This statement is primarily intended to be used with BIGSTR variables
  541.    which can be up to 2048 bytes long.  However, it will work with other
  542.    data types as well if desired.  Just be aware of the potential
  543.    problems in 'bit twidling' non-string buffers and then trying to
  544.    access them later as their 'intended' type without re-initializing the
  545.    variable.  If the bit parameter (an integer from 0 to the number of
  546.    bits in the object) is invalid no processing takes place.
  547.  
  548.  - Added a BITSET statement to set a specified bit from a variable. The
  549.    syntax is:
  550.  
  551.      BITSET variable,bit
  552.  
  553.    This statement is primarily intended to be used with BIGSTR variables
  554.    which can be up to 2048 bytes long.  However, it will work with other
  555.    data types as well if desired.  Just be aware of the potential
  556.    problems in 'bit twidling' non-string buffers and then trying to
  557.    access them later as their 'intended' type without re-initializing the
  558.    variable.  If the bit parameter (an integer from 0 to the number of
  559.    bits in the object) is invalid no processing takes place.
  560.  
  561.  - Added an ISBITSET() function to check the status of a specified bit in
  562.    a variable.  The syntax is:
  563.  
  564.      ISBITSET(variable,bit)
  565.  
  566.    This function is primarily intended to be used with BIGSTR variables
  567.    which can be up to 2048 bytes long.  However, it will work with other
  568.    data types (and expressions) as well if desired.
  569.  
  570.  - Added a MOUSEREG statement to set up a RIP mouse region on the remote
  571.    terminal.  The syntax is:
  572.  
  573.      MOUSEREG num,x1,y1,x2,y2,fontX,fontY,invert,clear,text
  574.  
  575.        num    = Is the RIP region number
  576.        x1,y1  = The (X,Y) coordinates of the upper-left of the region
  577.        x2,y2  = The (X,Y) coordinates of the lower-right of the region
  578.        fontX  = The width of each character in pixels
  579.        fontY  = The height of each character in pixels
  580.        invert = A boolean flag (TRUE to invert the region when clicked)
  581.        clear  = A boolean flag (TRUE to clear and full screen the text window)
  582.        text   = Text that the remote terminal should transmit when the region
  583.                 is clicked
  584.  
  585.  - Added a MEGANUM() function to convert a decimal number (from 0 to
  586.    1295) to a hexa-tri-decimal number, or meganum.  The syntax is:
  587.  
  588.      MEGANUM(number)
  589.  
  590.  - Added a SCRFILE statement to find a file name and line number that is
  591.    currently on the screen.  The syntax is:
  592.  
  593.      SCRFILE lineVar,filenameVar
  594.  
  595.        lineVar     = Should be set before calling to the line number to start
  596.                      searching on (1 is the top line); Will be set to the line
  597.                      number where the file name was found or 0 if no file name
  598.                      was found
  599.        filenameVar = Will be set to the file name if one is found on screen
  600.  
  601.  - Added a SORT statement to sort the contents of an array into a pointer
  602.    array.  The syntax is:
  603.  
  604.      SORT sortArray,pointerArray
  605.  
  606.        sortArray    = The data to sort (Any type may be used for this array)
  607.        pointerArray = An integer array which will be used as an array of
  608.                       pointers into sortArray for accessing sortArray in
  609.                       sorted order (This array should be of type INTEGER)
  610.  
  611.    Note that sortArray and pointerArray are restricted to one (1) dimensional
  612.    arrays.
  613.  
  614.    The following is an example of displaying an array in unsorted and sorted
  615.    order:
  616.  
  617.      STRING  s(999) ; Remember that arrays are 0-based, so these statements
  618.      INTEGER p(999) ; will allocate 1000 elements each
  619.  
  620.      ; Do something here to read data into s
  621.  
  622.      SORT s,p
  623.  
  624.      INTEGER i
  625.  
  626.      FOR i = 0 TO 999 ; This loop will display in unsorted order
  627.        PRINTLN s(i)
  628.      NEXT
  629.  
  630.      FOR i = 0 TO 999 ; This loop will display in sorted order
  631.        PRINTLN s(p(i))
  632.      NEXT
  633.  
  634.  - Added an EVTTIMEADJ() function to detect if the users time has been
  635.    adjusted for an upcoming event.  This is useful to detect if a users
  636.    time left can be increased with the ADJTIME statement.
  637.  
  638.  - Added a SEARCHINIT statement to initialize search parameters for a
  639.    faster BOYER-MOORE search algorithm.  The syntax is:
  640.  
  641.      SEARCHINIT criteria,caseSensitive
  642.  
  643.        criteria      = A string expression with the search criteria in the same
  644.                        format used by PCBoard (ie, "THIS & THAT | BOB")
  645.        caseSensitive = A boolean flag (TRUE to force a case sensitive search,
  646.                        FALSE otherwise)
  647.  
  648.  - Added a SEARCHFIND statement to do a BOYER-MOORE search on a text
  649.    buffer using criteria previously defined with a SEARCHINIT statement.
  650.    The syntax is:
  651.  
  652.      SEARCHFIND bufferExpr,foundVar
  653.  
  654.        bufferExpr = The buffer to search
  655.        foundVar   = Set to TRUE if bufferExpr contains the search criteria,
  656.                     FALSE otherwise
  657.  
  658.  - Added a SEARCHSTOP statement to clear out previously entered search
  659.    criteria.  It takes no parameters.
  660.  
  661.  - Added PRFOUND and PRFOUNDLN statements.  These work just like PRINT
  662.    and PRINTLN but, if the last SEARCHFIND statement resulted in a match,
  663.    it will automatically highlight found words.
  664.  
  665.  - Added a TPAGET statement to get static information from a named TPA in
  666.    string format.  The syntax is:
  667.  
  668.      TPAGET keyword,infoVar
  669.  
  670.        keyword = The keyword of the TPA to use
  671.        infoVar = The variable into which to store the information
  672.  
  673.  - Added a TPAPUT statement to put static information to a named TPA in
  674.    string format.  The syntax is:
  675.  
  676.      TPAPUT keyword,infoExpr
  677.  
  678.        keyword  = The keyword of the TPA to use
  679.        infoExpr = The expression to write to store the TPA
  680.  
  681.  - Added a TPACGET statement to get information from a named TPA for a
  682.    specified conference in string format.  The syntax is:
  683.  
  684.      TPACGET keyword,infoVar,confNum
  685.  
  686.        keyword = The keyword of the TPA to use
  687.        infoVar = The variable into which to store the information
  688.        confNum = The conference number for which to retrieve information
  689.  
  690.  - Added a TPACPUT statement to put information to a named TPA for a
  691.    specified conference in string format.  The syntax is:
  692.  
  693.      TPACPUT keyword,infoExpr,confNum
  694.  
  695.        keyword  = The keyword of the TPA to use
  696.        infoExpr = The expression to write to store the TPA
  697.        confNum  = The conference number for which to retrieve information
  698.  
  699.  - Added a TPAREAD statement to get static information from a named TPA.
  700.    The syntax is:
  701.  
  702.      TPAREAD keyword,infoVar
  703.  
  704.        keyword = The keyword of the TPA to use
  705.        infoVar = The variable into which to store the information
  706.  
  707.  - Added a TPAWRITE statement to put static information to a named TPA.
  708.    The syntax is:
  709.  
  710.      TPAWRITE keyword,infoExpr
  711.  
  712.        keyword  = The keyword of the TPA to use
  713.        infoExpr = The expression to write to store the TPA
  714.  
  715.  - Added a TPACREAD statement to get information from a named TPA for a
  716.    specified conference.  The syntax is:
  717.  
  718.      TPACREAD keyword,infoVar,confNum
  719.  
  720.        keyword = The keyword of the TPA to use
  721.        infoVar = The variable into which to store the information
  722.        confNum = The conference number for which to retrieve information
  723.  
  724.  - Added a TPACWRITE statement to put information to a named TPA for a
  725.    specified conference.  The syntax is:
  726.  
  727.      TPACWRITE keyword,infoExpr,confNum
  728.  
  729.        keyword  = The keyword of the TPA to use
  730.        infoExpr = The expression to write to store the TPA
  731.        confNum  = The conference number for which to retrieve information
  732.  
  733.  - Added FMTREAL() function to format REAL/DREAL values for display purposes.
  734.    The syntax is:
  735.  
  736.      FMTREAL(realExp,fieldWidth,decimalPlaces)
  737.  
  738.        realExp       = A REAL/DREAL floating point expression
  739.        fieldWidth    = The minimum number of characters to display
  740.        decimalPlaces = The number of characters to display to the right of
  741.                        the decimal point
  742.  
  743.